//定时执行指定任务
//Use Demo:
//  TimeManager TimeManagerForAll;
//  TimeRegObj* timeObj1;
//  TimeRegObj* timeObj2;
//  TimeManagerCreate(&TimeManagerForAll);
//  timeObj1 = TimeRegObjCreate(TimeReg1_Handle,400,&TimeManagerForAll);创建函数:TimeReg1_Handle, 400ms调用一次，默认永久运行
//  timeObj2 = TimeRegObjCreate(TimeReg2_Handle,800,&TimeManagerForAll);创建函数:TimeReg2_Handle, 800ms调用一次，默认永久运行
//  TimeRegObjRunCount(timeObj2,3)//设置timeObj2运行3次就停止
//主循环里写上:
//    TimeManagerScan(&TimeManagerForAll); //timeObj1会400ms更新; timeObj2 800ms更新一次并且3次后停止
//中断函数中写上:
//    TimeManagerScanTimeMs(&TimeManagerForAll,10); //10ms的扫描频率


#ifndef MCU_TIMEMANAGER_H
#define MCU_TIMEMANAGER_H

#include <stdio.h>
#include <stdint.h>

// 会员类 有多个
#define TimeRegObj_Length 20 //TimeReg数组长度
typedef void (*TimeRegHandleFptr)(void); //会员要执行的函数指针
typedef struct 
{
    TimeRegHandleFptr funptr;
    uint32_t TimeReg;
    uint32_t funcdoCount;
    char LoopCan;
    uint8_t Trigger; //定时器自动重载触发, 1:触发有效, 0:无触发
}TimeRegObj; //定时器注册对象
typedef struct 
{
    TimeRegObj TimeRegObjHandle[TimeRegObj_Length];
    int TimeRegObjCountMs[TimeRegObj_Length];
    int TimeRegObjCountMsTemp[TimeRegObj_Length];
    // unsigned char TimeMangerRegObjSta[TimeRegObj_Length];//执行状态
} TimeManager;

typedef void (*TimeHandle)(void);
//放到初始化
void TimeManagerCreate(TimeManager *base);
//放入中断中
void TimeManagerScanTimeMs(TimeManager *base, int freq_ms);
//放在主循环里
void TimeManagerScan(TimeManager *base);
//返回找到的地址 没有找到是0
TimeRegObj *TimeManagerCheck(TimeManager *base, TimeRegObj *obj);
//删除base下的所有obj
void TimeManagerDelAll(TimeManager *base);
//在执行期间更改执行的时间频率，这个要在上一轮执行完成后才更新
void TimeManagerUpdataTime(TimeManager *base, TimeRegObj *obj, int time);
//用来判断对应的TimeRegObj是否到达时间
unsigned char TimeManagerCheckTimeIsOver(TimeManager *base, TimeRegObj *obj);

//创建并添加 obj, 如果obj已经存在, 返回已存在的值, 默认obj循环执行
TimeRegObj *TimeRegObjCreate(void (*Handle)(), int time, TimeManager *Manager);
//删除 obj
void TimeRegObjDestory(TimeManager *base, TimeRegObj *obj);
//更新会员的时间,包括管理员的时间
void TimeRegObjUpdataTime(TimeManager *Manager, TimeRegObj *obj, int time);
//设置obj只能运行count次
void TimeManager_RunCount(TimeRegObj *obj, int count);
//解除注册,TimeManagerDelete调用后, 必须自己手动设置 obj = NULL,才能把全局变量指针obj的地址置0
void TimeManagerDelete(TimeManager *base, TimeRegObj *obj);

#endif
